/**
 * 
 */
package belote.service.game;

/**
 * @author Gwenn
 * 
 */
public class Table {

	// ------------------------------------------------------------------------
	// ATTRIBUTS
	// ------------------------------------------------------------------------

	private final long _id;

	private final String _nom;

	private BeloteType _typeBelote = BeloteType.CLASSIQUE_SANS_ANNONCE;

	private boolean _privee;

	private String _motDePasse;

	private final Joueur[] _joueurs = new Joueur[4];

	private int _pointsVictoire = 1000;

	private boolean _initialisee;

	// ------------------------------------------------------------------------
	// CONSTRUCTEUR
	// ------------------------------------------------------------------------

	public Table(long pId, String pNom) {
		this._id = pId;
		this._nom = pNom;
	}

	// ------------------------------------------------------------------------
	// METHODES 'PUBLIC'
	// ------------------------------------------------------------------------

	public void initialisation() {

		this._initialisee = true;
	}

	public synchronized void ajouterJoueur(int pPosition, Joueur pJoueur) throws PlaceOccupeeException {

		if (pPosition < 0 || pPosition > 3)
			throw new IllegalArgumentException("La position devrait \u00EAtre comprise entre 0 et 3.");

		if (pJoueur == null)
			throw new IllegalArgumentException("Le joueur ne devrait pas \u00EAtre <null>.");

		// Si la place est occupee par un humain (!= robot)
		if (this._joueurs[pPosition] != null && this._joueurs[pPosition].getTypeJoueur() == JoueurType.HUMAIN)
			throw new PlaceOccupeeException();

		// Si le place est libre ou si la place etait occup�e par un robot
		if (this._joueurs[pPosition] == null || (this._joueurs[pPosition].getTypeJoueur() == JoueurType.ROBOT && pJoueur.getTypeJoueur() == JoueurType.HUMAIN)) {

			pJoueur.setTable(this);
			this._joueurs[pPosition] = pJoueur;

		}
	}

	public synchronized void supprimerJoueur(Joueur pJoueur) {

		if (pJoueur == null)
			throw new IllegalArgumentException("Le joueur ne devrait pas �tre <null>.");

		for (int i = 0; i < 4; i++) {
			Joueur joueur = this._joueurs[i];
			if (joueur != null && joueur.equals(pJoueur)) {
				pJoueur.setTable(null);
				this._joueurs[i] = null;
			}
		}
	}

	public void setTypeBelote(BeloteType pTypeBelote) {

		if (this._initialisee)
			throw new IllegalStateException("Impossible de changer le type de belote une fois la table initialis�e.");

		this._typeBelote = pTypeBelote;
	}

	public void setPointsVictoire(int pPointsVictoire) {

		if (this._initialisee)
			throw new IllegalStateException("Impossible de changer le nombre de point de la victoire une fois la table initialis�e.");

		this._pointsVictoire = pPointsVictoire;
	}

	public void setPrivate(String pMotDePasse) {

		if (this._initialisee)
			throw new IllegalStateException("Impossible de rendre une table priv�e une fois la table initialis�e.");

		if (pMotDePasse != null) {
			this._privee = true;
			this._motDePasse = pMotDePasse;
		}
	}

	// ------------------------------------------------------------------------
	// GETTERS
	// ------------------------------------------------------------------------

	public long getId() {
		return this._id;
	}

	public String getNom() {
		return this._nom;
	}

	public boolean isPrivee() {
		return this._privee;
	}

	public String getMotDePasse() {
		return this._motDePasse;
	}

	public BeloteType getTypeBelote() {
		return this._typeBelote;
	}

	public Joueur[] getJoueurs() {
		return this._joueurs;
	}

	public int getPointsVictoire() {
		return this._pointsVictoire;
	}
}
